package com.ruoyi.act.module.service;

import com.ruoyi.act.module.domain.ActProcess;
import org.activiti.engine.runtime.ProcessInstance;

/**
 * 启动一个流程实例
 *
 * @author hcj
 */
public interface IProcessService {

    /**
     * 使用给定的键在最新版本的流程定义中启动一个新流程实例。
     * 参数：
     * processDefinitionKey –流程定义的关键字，不能为null。
     * 抛出：
     * ActivitiObjectNotFoundException –如果没有使用给定的键部署任何流程定义。
     *
     * @param processDefinitionKey
     * @return
     */
    ProcessInstance startProcessInstanceByKey(String processDefinitionKey);


    /**
     * 使用给定的键在最新版本的流程定义中启动一个新流程实例。
     * 可以提供业务密钥以将流程实例与具有明确业务含义的特定标识符相关联。
     * 例如，在订单流程中，业务密钥可以是订单ID。
     * 然后，可以使用此业务密钥轻松查找该流程实例，
     * 请参阅ProcessInstanceQuery.processInstanceBusinessKey（String）。
     * 提供这样的业务密钥绝对是最佳实践。 processdefinitionKey-businessKey的组合必须唯一。
     * 参数：
     * processDefinitionKey –流程定义的关键字，不能为null。
     * businessKey –在上下文或给定的流程定义中唯一标识流程实例的关键字。
     * 变量–要传递的变量，可以为null。
     * 抛出：
     * ActivitiObjectNotFoundException –如果没有使用给定的键部署任何流程定义。
     *
     * @param actProcess 流程动态参数部分 通过这个参数传递
     * @return
     */
    ProcessInstance startProcessInstanceByKey(ActProcess actProcess);

    /**
     * 删除现有的运行时流程实例。
     * 参数：
     * processInstanceId –要删除的流程实例的ID，不能为null。
     * deleteReason-删除原因，可以为null。
     * 抛出：
     * ActivitiObjectNotFoundException –如果找不到具有给定ID的流程实例
     *
     * @param processId
     * @param reason
     */
    void deleteProcessInstance(String processId, String reason);

    /**
     * 用给定的ID挂起流程实例。 如果流程实例处于暂停状态，则activiti将不会执行与此实例关联的作业（计时器，消息）。
     * 如果您具有流程实例层次结构，则从该层次结构中暂挂一个流程实例将不会暂挂该层次结构中的其他流程实例。
     * 抛出：
     * ActivitiObjectNotFoundException-如果找不到这样的processInstance。
     * ActivitiException –流程实例已经处于挂起状态。
     *
     * @param processId
     */
    void suspendProcessInstanceById(String processId);

    /**
     * 使用给定的ID激活流程实例。 如果您具有流程实例层次结构，则从该层次结构中暂挂一个流程实例将不会暂挂该层次结构中的其他流程实例。
     * 抛出：
     * ActivitiObjectNotFoundException-如果找不到这样的processInstance。
     * ActivitiException-如果流程实例已经处于活动状态。
     *
     * @param processId
     */
    void activateProcessInstanceById(String processId);
}
